package com.zq.vaccinum.util;

import com.zq.vaccinum.constant.Constants;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.io.Decoders;
import io.jsonwebtoken.security.Keys;

import java.util.Date;
import java.util.Map;

/**
 * JwtToken工具类
 * @Author: zq
 * @Date: 2023/08/03/0:51
 * @Description:
 */
public class JwtTokenUtil {

    /**
     * 生成token令牌
     * @param claims 数据声明(载荷信息)
     * @return  token
     */
    public static String createToken(Map<String,Object> claims){
        String token = Jwts.builder()
                // 使用默认头
                .setClaims(claims) // 存放自定义载荷
                .setExpiration(getExpirationDate()) // 失效时间
                .signWith(Keys.hmacShaKeyFor(Decoders.BASE64.decode(Constants.JWT_SECRET))) // 签名
                .compact();
        return token;
    }

    /**
     * 解析token中的数据声明(载荷信息)
     * @param token 令牌
     * @return  数据声明
     */
    public static Claims parseToken(String token){
        return Jwts.parserBuilder()
                .setSigningKey(Decoders.BASE64.decode(Constants.JWT_SECRET))    // 签名
                .build()
                .parseClaimsJws(token)  // 接收的token令牌
                .getBody();
    }
    /**
     * 生成Token失效截至时间
     * @return
     */
    private static Date getExpirationDate(){
        // 当前系统时间+失效时间
        return new Date(System.currentTimeMillis()+ Constants.JWT_EXPIRATION);
    }

    /**
     * 从Token获取用户名
     * @param token
     * @return
     */
    public static String getUsername(String token){
        // parseToken()解析Token获取claims
        return parseToken(token).getSubject();
    }

    /**
     * 判断token是否失效
     * @param token
     * @return
     */
    public static boolean isTokenExpired(String token){
        // 判断当前时间是否在时效截止时间内(截止时间是否在当前时间之前)
        return getExpirationDate().before(new Date());
    }

    /**
     * 验证token是否有效(是否修改null,是否过期)
     * @param token
     * @return
     */
    public static boolean validateToken(String token){
        return parseToken(token)!=null&&isTokenExpired(token);
    }

    /**
     * 刷新token
     * @param token
     * @return
     */
    public static String refreshToken(String token){
        // 解析token
        Claims claims = parseToken(token);
        // 重置创建时间
        claims.put(Constants.JWT_CREATE_TIME,new Date());
        // 生成新的token
        return createToken(claims);
    }

    /**
     * 从载体信息中根据key拿值
     * @param claims  载体信息
     * @param key  键
     * @return  值
     */
    public static String getValueByKey(Claims claims,String key){
        return claims.get(key)!=null?claims.get(key).toString():null;
    }

}
